package com.buddy.sds.auth.oauth2.token.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.buddy.sds.auth.oauth2.entity.SystemOauthToken;
import com.buddy.sds.auth.oauth2.mapper.ISystemOauthTokenMapper;
import com.buddy.sds.auth.oauth2.token.TokenManager;
import org.springframework.beans.factory.annotation.Autowired;

import java.time.LocalDateTime;

public class JDBCTokenManager implements TokenManager {

    @Autowired
    private ISystemOauthTokenMapper tokenMapper;

    @Override
    public Token putToken(String username, String client_id, String token, String refresh_token, long tokenExpireTime, long refreshTokenExipreTime) {

        SystemOauthToken systemOauthToken = tokenMapper.selectOne(new LambdaQueryWrapper<SystemOauthToken>().eq(SystemOauthToken::getTokenUser,username).eq(SystemOauthToken::getTokenClient,client_id));

        if(systemOauthToken == null){

            systemOauthToken = new SystemOauthToken(null, LocalDateTime.now(),tokenExpireTime,refresh_token,token,username,client_id,refreshTokenExipreTime);

            if(tokenMapper.insert(systemOauthToken) > 0){

                return new Token(token,refresh_token,tokenExpireTime);
            }
        }else{
            systemOauthToken.setTokenCreatetime(LocalDateTime.now());
            systemOauthToken.setTokenExpireTime(tokenExpireTime);
            systemOauthToken.setTokenRefreshToken(refresh_token);
            systemOauthToken.setTokenRefreshExpireTime(refreshTokenExipreTime);
            systemOauthToken.setTokenToken(token);
            if(tokenMapper.updateById(systemOauthToken) > 0){

                return new Token(token,refresh_token,tokenExpireTime);
            }
        }


        return null;
    }

    @Override
    public Token getToken(String username, String client_id) {

        SystemOauthToken token = tokenMapper.selectOne(new LambdaQueryWrapper<SystemOauthToken>().eq(SystemOauthToken::getTokenUser,username).eq(SystemOauthToken::getTokenClient,client_id));


        if(token != null && token.getTokenExpireTime() > System.currentTimeMillis()){

            return new Token(token.getTokenToken(),token.getTokenRefreshToken(),token.getTokenExpireTime());
        }

        return null;
    }

    @Override
    public boolean verifyToken(String token) {

        SystemOauthToken oauthToken = tokenMapper.selectOne(new LambdaQueryWrapper<SystemOauthToken>().eq(SystemOauthToken::getTokenToken,token));

        if(oauthToken != null && oauthToken.getTokenExpireTime() > System.currentTimeMillis()){
            return true;
        }
        return false;
    }

    @Override
    public boolean verifyRefreshToken(String refreshToken) {

        SystemOauthToken token = tokenMapper.selectOne(new LambdaQueryWrapper<SystemOauthToken>().eq(SystemOauthToken::getTokenRefreshToken,refreshToken));


        if(token != null && token.getTokenRefreshExpireTime() > System.currentTimeMillis()){

            return true;
        }

        return false;
    }

    @Override
    public String getUser(String token) {

        SystemOauthToken oauthToken = tokenMapper.selectOne(new LambdaQueryWrapper<SystemOauthToken>().eq(SystemOauthToken::getTokenToken,token));

        if(oauthToken != null && oauthToken.getTokenExpireTime() > System.currentTimeMillis()){
            return oauthToken.getTokenUser();
        }
        return null;
    }
}
